home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 2
/
Nebula Two.iso
/
SourceCode
/
Palettes
/
Document
/
DocumentIcon.m
< prev
next >
Wrap
Text File
|
1995-06-12
|
6KB
|
255 lines
/* DocumentIcon.m:
* You may freely copy, distribute, and reuse the code in this example.
* NeXT disclaims any warranty of any kind, expressed or implied, as to its
* fitness for any particular use.
*
* Written by Adam Hertz
* Modified: Mike Riggs, Mai Nguyen
*
*/
#import <dbkit/dbkit.h>
#import "DocumentIcon.h"
@implementation DocumentIcon
- initFrame:(const NXRect *)frameRect
{
const char *dragTypes;
[super initFrame:frameRect];
dragTypes = NXFilenamePboardType;
[self registerForDraggedTypes:&dragTypes count: 1];
return self;
}
- free
{
[self unregisterDraggedTypes];
return [super free];
}
- drawSelf:(const NXRect *)rects :(int)rectCount
{
NXRect imageRect;
NXSize imageSize;
NXPoint drawOrigin;
NXDrawGrayBezel(&bounds, rects);
imageRect.origin.x = bounds.origin.x + 2;
imageRect.origin.y = bounds.origin.y + 2;
imageRect.size.width = bounds.size.width - 4;
imageRect.size.height = bounds.size.height - 4;
PSgsave();
NXRectClip(&imageRect);
if (image != nil) {
[image getSize:&imageSize];
drawOrigin = imageRect.origin;
drawOrigin.x += (imageRect.size.width - imageSize.width) / 2;
drawOrigin.y += (imageRect.size.height - imageSize.height) / 2;
[image composite:NX_SOVER toPoint:&drawOrigin];
}
PSgrestore();
return self;
}
#define mask (NX_LMOUSEUPMASK|NX_LMOUSEDRAGGEDMASK)
#define Shift(e) (e->flags&(NX_NEXTLSHIFTKEYMASK|NX_NEXTRSHIFTKEYMASK))
#ifndef abs
#define abs(x) (((x)<0)? -(x) : (x))
#endif
int
mouseMoved(NXPoint *o, int n) { /* true if mouse moves > n pixels from 'o' */
NXEvent *e;
NXPoint p;
float d;
do {
e = [NXApp getNextEvent:mask];
p = e->location;
d = abs(p.x-o->x);
if (d < abs(p.y-o->y)) d = abs(p.y-o->y);
} while (e->type != NX_LMOUSEUP && d<n);
*o = p;
return e->type != NX_LMOUSEUP;
}
- mouseDown: (NXEvent *) e
{
NXPoint hitPoint;
int oldMask;
NXEvent saveEvent;
Pasteboard *dragPasteboard;
/* Call the workspace protocol to open the file at a double-click */
if( e->data.mouse.click > 1
&& filename && *filename) {
[[Application workspace] openFile: filename];
}
oldMask = [window eventMask];
[window setEventMask:(oldMask|mask)];
saveEvent = *e;
hitPoint = e->location;
if (mouseMoved(&hitPoint,4)) {
NXRect dragRect;
if( filename && *filename) {
[self convertPoint: &hitPoint fromView: nil];
[self getBounds: &dragRect];
dragPasteboard = [Pasteboard newName: NXDragPboard];
[dragPasteboard declareTypes: &NXFilenamePboardType num: 1 owner: nil];
[dragPasteboard writeType: NXFilenamePboard data: filename
length: strlen( filename)];
[self dragImage:image at:&(dragRect.origin) offset:&hitPoint
event:&saveEvent pasteboard:dragPasteboard
source:self slideBack: YES];
}
}
return [super mouseDown: e];
}
- (NXDragOperation)draggingSourceOperationMaskForLocal:(BOOL)flag
{
return NX_DragOperationCopy;
}
- setTarget:anObject {target = anObject; return self;}
- setAction:(SEL)aSelector {action = aSelector; return self;}
- target {return target;}
- (SEL)action {return action;}
- (const char *) stringValue
{
return filename;
}
- setStringValue:(const char *)aString
{
int len;
if (filename)
NXZoneFree([self zone], (void *)filename);
filename = NULL;
if (aString) {
filename = NXCopyStringBufferFromZone(aString,[self zone]);
if (filename && *filename && aString) {
for (len = strlen(filename) - 1; len > 0; len--) {
if (filename[len] == ' ') {
filename[len] = '\0';
} else
break;
}
image = [[Application workspace] getIconForFile:filename];
[self display];
}
}
return self;
}
/**********************************************************************/
/* Archiving */
- read:(NXTypedStream *)stream
{
const char *dragTypes = NXFilenamePboardType;
[super read: stream];
[self registerForDraggedTypes:&dragTypes count: 1];
return self;
}
/**********************************************************************/
/* Dragging */
- (NXDragOperation) draggingEntered: sender
{
id dragPasteboard;
char *path;
int length;
dragPasteboard = [sender draggingPasteboard];
if( ([dragPasteboard readType:NXFilenamePboardType
data:&path length:&length])
&& (path && *path && *path == '/')) {
return NX_DragOperationCopy;
}
return NX_DragOperationNone;
}
- (BOOL)performDragOperation:(id <NXDraggingInfo>)sender
{
char *path;
int length;
id dragPasteboard;
dragPasteboard = [sender draggingPasteboard];
if ([dragPasteboard readType:NXFilenamePboardType
data:&path length:&length]) {
char p[MAXPATHLEN];
strncpy( p, path, length);
p[length] = '\0';
if( filename) NXZoneFree( [self zone], (void *)filename);
filename = NULL;
filename = NXCopyStringBuffer(p);
image = [sender draggedImageCopy];
[dragPasteboard deallocatePasteboardData:path length:length];
[self display];
if( target != nil)
[self sendAction:action to:target];
return YES;
}
return NO;
}
- draggingExited:sender
{
return self;
}
/**********************************************************************/
/* DBCustomAssociation Implementation */
- updateForAssociation:association
{
id val = [[DBValue alloc] init];
[[[association fetchGroup] recordList] getValue:val
forProperty:[association expression]
at:[[association fetchGroup] currentRecord]];
[self setStringValue:[val stringValue]];
[val free];
return self;
}
- associationContentsDidChange:association
{
return [self updateForAssociation: association];
}
- associationSelectionDidChange:association
{
return [self updateForAssociation: association];
}
@end